\tikzstyle{rec} = [draw, anchor=west, minimum height=2.5em, minimum width=5em]
\tikzstyle{ell} = [draw, shape=ellipse, minimum height=2.5em, anchor=west]
\tikzstyle{arr} = [->]
\begin{tikzpicture}
    
    \newcommand{\Xshift}{2em}
    \node[rec, shape=chamfered rectangle, chamfered rectangle corners=north west] (源语言) at (0,0) {源语言};
    \node[ell] (编译程序) at ([xshift=\Xshift]源语言.east) {编译程序};
    \node[rec] (目标语言) at ([xshift=\Xshift]编译程序.east) {目标语言};
    \node[ell] (运行程序) at ([xshift=\Xshift]目标语言.east) {运行程序};
    \node[rec, shape=tape, tape bend top=none, tape bend height=0.3em] (结果) at ([xshift=\Xshift]运行程序.east) {结果};
    \node[rec, anchor=south] (数据) at ([yshift=1em]运行程序.north) {数据};
    \node[rec, anchor=north] (编译阶段) at ([xshift=0em,yshift=-1em]编译程序.south) {编译阶段};
    \node[rec, anchor=north] (运行阶段) at ([xshift=0em,yshift=-1em]运行程序.south) {运行阶段};
    
    \draw[arr] (源语言) -- (编译程序);
    \draw[arr] (编译程序) -- (目标语言);
    \draw[arr] (目标语言) -- (运行程序);
    \draw[arr] (运行程序) -- (结果);
    \draw[arr] (数据.south) -- (运行程序.north); 
    \draw[|<-] (源语言.west|-编译阶段) -- (编译阶段.west);
    \draw[->|] (编译阶段.east) -- (目标语言|-编译阶段);
    \draw[<-] (目标语言|-编译阶段) -- (运行阶段.west);
    \draw[->|] (运行阶段.east) -- (运行阶段-|结果.east); 
    
\end{tikzpicture} 